package br.com.viewcar.web.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.viewcar.entity.Bairro;
import br.com.viewcar.entity.Cidade;
import br.com.viewcar.entity.Cliente;
import br.com.viewcar.entity.Estado;
import br.com.viewcar.entity.Permissao;
import br.com.viewcar.service.BairroService;
import br.com.viewcar.service.CidadeService;
import br.com.viewcar.service.ClienteService;
import br.com.viewcar.service.EstadoService;
import br.com.viewcar.service.PermissaoService;

@Scope("session")
@Component("clienteBean")
public class ClienteBean extends EntityBean<Integer, Cliente> {

	@Autowired
	private ClienteService service;

	@Autowired
	private CidadeService cidadeService;

	@Autowired
	private EstadoService estadoService;

	@Autowired
	private BairroService bairroService;

	@Autowired
	private PermissaoService permissaoService;

	private Permissao permissao;

	protected Integer retrieveEntityId(Cliente entity) {

		return entity.getId();
	}

	protected ClienteService retrieveEntityService() {

		return this.service;
	}

	protected Cliente createNewEntity() {

		Cliente cliente = new Cliente();

		cliente.setBairro(new Bairro());

		cliente.getBairro().setEstado(estadoService.retrieve(6));

		cliente.getBairro().setCidade(new Cidade());

		return cliente;
	}

	public Permissao getPermissao() {

		if (permissao == null) {

			permissao = new Permissao();
		}

		return permissao;
	}

	public void setPermissao(Permissao permissao) {

		this.permissao = permissao;
	}

	public List<SelectItem> getTipoDocumentos(){

		List<SelectItem> result = new ArrayList<SelectItem>();

		result.add(new SelectItem(1, "CPF"));

		result.add(new SelectItem(2, "CNPJ"));

		return result;
	}

	public List<SelectItem> getEstados(){

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Estado> estados = estadoService.retrieveAll();

		for (Estado estado : estados) {

			result.add(new SelectItem(estado.getId(), estado.getNome()));
		}

		return result;
	}

	public List<SelectItem> getCidades() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Cidade> cidades = new ArrayList<Cidade>(cidadeService.findByEstado(6));

		for (Cidade cidade : cidades) {

			result.add(new SelectItem(cidade.getId(), cidade.getNome()));
		}

		return result;
	}

	public List<SelectItem> getBairros() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		Integer id = new Integer(58);

		if (id != null) {

			List<Bairro> bairros = bairroService.findByCidade(id);

			for (Bairro bairro : bairros) {

				result.add(new SelectItem(bairro.getId(), bairro.getNome()));
			}
		}

		return result;
	}

	public boolean isPermissaoStatus() {

		return getListaPermissoes().size() > 0;
	}

	public List<SelectItem> getListaPermissoes() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Permissao> permissoes = permissaoService.retrieveAll();
		
		Collections.sort(permissoes, new Comparator<Permissao>() {

			public int compare(Permissao o1, Permissao o2) {

				return o1.getNome().compareTo(o2.getNome());

			}
		});

		return result;
	}

	public List<SelectItem> getListaClientes() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Cliente> clientes = service.retrieveAll();
		
		Collections.sort(clientes, new Comparator<Cliente>() {

			public int compare(Cliente o1, Cliente o2) {

				return o1.getNome().compareTo(o2.getNome());

			}
		});

		for (Cliente cliente : clientes) {

			result.add(new SelectItem(cliente.getId(), cliente.getNome()));
		}

		return result;
	}

	public List<SelectItem> getListaClientesAll(){

		List<SelectItem> result = new ArrayList<SelectItem>();

		result.add(new SelectItem(null,"Todos" ));

		result.addAll(getListaClientes());

		return  result;
	}

	public String atualizarCliente() {

		Cliente cliente = retrieveEntityService().retrieve(this.entity.getId());

		this.entity.setNumeroContrato(cliente.getNumeroContrato());

		this.entity.setDescricaoContrato(cliente.getDescricaoContrato());

		this.entity.setDataContrato(cliente.getDataContrato());

		this.entity.setDataValidadeContrato(cliente.getDataValidadeContrato());

		return update();
	}
}